package com.dji.sample.wayline.controller;

import com.dji.sample.wayline.model.entity.DockApron;
import com.dji.sample.wayline.service.IDockApronService;
import com.dji.sdk.common.HttpResultResponse;
import com.dji.sdk.common.PaginationData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Optional;

/**
 * 机场停机坪控制器
 * 提供机场停机坪信息的RESTful API接口
 *
 * @author sean
 * @version 1.0
 * @date 2024/1/1
 */
@RestController
@RequestMapping("${url.wayline.prefix}${url.wayline.version}/dock-aprons")
@Slf4j
public class DockApronController {

    @Autowired
    private IDockApronService dockApronService;

    /**
     * 创建机场停机坪信息
     * @param dockApron 机场停机坪信息
     * @return 创建结果
     */
    @PostMapping
    public HttpResultResponse<DockApron> createDockApron(@Valid @RequestBody DockApron dockApron) {
        return dockApronService.createDockApron(dockApron);
    }

    /**
     * 根据ID删除机场停机坪信息
     * @param id 停机坪ID
     * @return 删除结果
     */
    @DeleteMapping("/id/{id}")
    public HttpResultResponse<Boolean> deleteDockApronById(@PathVariable Long id) {
        return dockApronService.deleteDockApronById(id);
    }

    /**
     * 根据停机坪编号删除机场停机坪信息
     * @param apronNo 停机坪编号
     * @return 删除结果
     */
    @DeleteMapping("/{apronNo}")
    public HttpResultResponse<Boolean> deleteDockApronByApronNo(@PathVariable String apronNo) {
        return dockApronService.deleteDockApronByApronNo(apronNo);
    }

    /**
     * 批量删除机场停机坪信息
     * @param apronNos 停机坪编号列表
     * @return 删除结果
     */
    @DeleteMapping("/batch")
    public HttpResultResponse<Boolean> deleteDockAprons(@RequestBody List<String> apronNos) {
        return dockApronService.deleteDockAprons(apronNos);
    }

    /**
     * 更新机场停机坪信息
     * @param apronNo 停机坪编号
     * @param dockApron 机场停机坪信息
     * @return 更新结果
     */
    @PutMapping("/{apronNo}")
    public HttpResultResponse<Boolean> updateDockApron(@PathVariable String apronNo, 
                                                      @Valid @RequestBody DockApron dockApron) {
        dockApron.setApronNo(apronNo);
        return dockApronService.updateDockApron(dockApron);
    }

    /**
     * 根据ID查询机场停机坪信息
     * @param id 停机坪ID
     * @return 机场停机坪信息
     */
    @GetMapping("/id/{id}")
    public HttpResultResponse<DockApron> getDockApronById(@PathVariable Long id) {
        Optional<DockApron> dockApron = dockApronService.getDockApronById(id);
        if (dockApron.isPresent()) {
            return HttpResultResponse.success(dockApron.get());
        } else {
            return HttpResultResponse.error("停机坪不存在");
        }
    }

    /**
     * 根据停机坪编号查询机场停机坪信息
     * @param apronNo 停机坪编号
     * @return 机场停机坪信息
     */
    @GetMapping("/{apronNo}")
    public HttpResultResponse<DockApron> getDockApronByApronNo(@PathVariable String apronNo) {
        Optional<DockApron> dockApron = dockApronService.getDockApronByApronNo(apronNo);
        if (dockApron.isPresent()) {
            return HttpResultResponse.success(dockApron.get());
        } else {
            return HttpResultResponse.error("停机坪不存在");
        }
    }

    /**
     * 根据停机坪名称查询机场停机坪信息
     * @param apronName 停机坪名称
     * @return 机场停机坪信息
     */
    @GetMapping("/name/{apronName}")
    public HttpResultResponse<DockApron> getDockApronByApronName(@PathVariable String apronName) {
        Optional<DockApron> dockApron = dockApronService.getDockApronByApronName(apronName);
        if (dockApron.isPresent()) {
            return HttpResultResponse.success(dockApron.get());
        } else {
            return HttpResultResponse.error("停机坪不存在");
        }
    }

    /**
     * 分页查询机场停机坪信息
     * @param page 页码，默认为1
     * @param pageSize 每页大小，默认为10
     * @param status 停机坪状态（可选）
     * @return 分页结果
     */
    @GetMapping
    public HttpResultResponse<PaginationData<DockApron>> getDockAprons(
            @RequestParam(defaultValue = "1") Long page,
            @RequestParam(value = "page_size", defaultValue = "10") Long pageSize,
            @RequestParam(required = false) Integer status) {
        PaginationData<DockApron> result = dockApronService.getDockAprons(page, pageSize, status);
        return HttpResultResponse.success(result);
    }

    /**
     * 查询所有机场停机坪信息
     * @return 机场停机坪列表
     */
    @GetMapping("/all")
    public HttpResultResponse<List<DockApron>> getAllDockAprons() {
        List<DockApron> dockAprons = dockApronService.getAllDockAprons();
        return HttpResultResponse.success(dockAprons);
    }

    /**
     * 根据状态查询机场停机坪信息
     * @param status 停机坪状态
     * @return 机场停机坪列表
     */
    @GetMapping("/status/{status}")
    public HttpResultResponse<List<DockApron>> getDockApronsByStatus(@PathVariable Integer status) {
        List<DockApron> dockAprons = dockApronService.getDockApronsByStatus(status);
        return HttpResultResponse.success(dockAprons);
    }

    /**
     * 根据地理位置范围查询机场停机坪信息
     * @param minLongitude 最小经度
     * @param maxLongitude 最大经度
     * @param minLatitude 最小纬度
     * @param maxLatitude 最大纬度
     * @return 机场停机坪列表
     */
    @GetMapping("/location")
    public HttpResultResponse<List<DockApron>> getDockApronsByLocation(
            @RequestParam(required = false) Double minLongitude,
            @RequestParam(required = false) Double maxLongitude,
            @RequestParam(required = false) Double minLatitude,
            @RequestParam(required = false) Double maxLatitude) {
        List<DockApron> dockAprons = dockApronService.getDockApronsByLocation(
                minLongitude, maxLongitude, minLatitude, maxLatitude);
        return HttpResultResponse.success(dockAprons);
    }

    /**
     * 根据高度范围查询机场停机坪信息
     * @param minAltitude 最小高度
     * @param maxAltitude 最大高度
     * @return 机场停机坪列表
     */
    @GetMapping("/altitude")
    public HttpResultResponse<List<DockApron>> getDockApronsByAltitude(
            @RequestParam(required = false) Double minAltitude,
            @RequestParam(required = false) Double maxAltitude) {
        List<DockApron> dockAprons = dockApronService.getDockApronsByAltitude(minAltitude, maxAltitude);
        return HttpResultResponse.success(dockAprons);
    }
}